Saltar al contenido principal

3.1 Estructuras Condicionales

De no ser por las estructuras de control, un programa en Python se ejecutaría de manera lineal, instrucción tras instrucción, hasta finalizar. Sin embargo, muchas veces queremos que el programa tome decisiones según ciertas condiciones: que ejecute un bloque de código si ocurre algo, y otro bloque diferente si no ocurre.

Aquí es donde entran en juego las estructuras condicionales, que permiten al programa ramificarse en diferentes caminos.

En Python existen dos grandes enfoques:

  1. Condicional clásico: if / elif / else

    • Adecuado para comprobaciones lógicas simples o encadenadas.
    • Ejemplo: comprobar si un número es positivo, negativo o cero.
  2. Emparejamiento estructural: match / case (desde Python 3.10)

    • Inspirado en el pattern matching o Switch de otros lenguajes.
    • Potente para manejar múltiples alternativas, valores complejos y patrones de datos estructurados.
    • Ejemplo: analizar un error y decidir la acción.

1️⃣ Condicional clásico: if / elif / else​

🟩 Uso del if​

El condicional más básico es el if. Nos permite controlar si un bloque de código se ejecutará o no mediante una condición.

✍️ sintaxis de la estructura condicional 'if'
if condicion:
# bloque de codigo que se ejecuta si la condicion es verdadera
diagrama de estructura condicional if

Supongamos que queremos dividir dos valores a y b. Antes de realizar la operación a/b debemos asegurarnos de que b no sea cero, ya que la división por cero no está definida.

📌 Ejemplo de uso de if
a = 4
b = 2

if b != 0:
print(a/b)
en este ejemplo
  1. La condición es b != 0.
  2. El bloque indentado debajo del if solo se ejecutará si la condición es verdadera.
indentación

Algo muy importante en Python es la indentación: el bloque de código debe ir tabulado, de lo contrario se producirá un error.

if b != 0:
c = a/b
d = c + 1
print(d) # Todo esto está dentro del bloque if

print("Fin del programa") # Esto está fuera, se ejecuta siempre

🟦 Uso de else​

Muchas veces queremos no solo ejecutar un bloque si se cumple una condición, sino también ejecutar otro distinto si no se cumple. Para ello se usa la cláusula else.

✍️ sintaxis del 'else'
if condicion:
# bloque si se cumple la condición
else:
# bloque si no se cumple la condición
diagrama de estructura condicional else
📌 Ejemplo de uso de if / else
x = 5
if x == 5:
print("Es 5")
else:
print("No es 5")
en este ejemplo

Aquí, el programa elegirá uno de los dos caminos posibles, nunca ambos.


🟨 Uso de elif​

En algunos casos no hay solo dos alternativas, sino varias. Python permite añadir tantas condiciones como queramos mediante elif.

✍️ sintaxis del 'elif'
if condicion1:
# bloque si condicion1 es verdadera
elif condicion2:
# bloque si condicion2 es verdadera
elif condicion_n:
# bloque si condicion_n es verdadera
else:
# bloque si ninguna condicion anterior se cumple
diagrama de estructura condicional elif
📌 Ejemplo de uso de elif
x = 7

if x == 5:
print("Es 5")
elif x == 6:
print("Es 6")
elif x == 7:
print("Es 7")
else:
print("Es otro número")
en este ejemplo

El programa evaluará las condiciones en orden, y ejecutará solo el bloque de la primera que sea verdadera.

🟧 Operador ternario​

Cuando queremos escribir un if/else en una sola línea, Python ofrece el operador ternario, también conocido como expresión condicional.

📌 Ejemplo de uso del operador ternario
x = 5
print("Es 5" if x == 5 else "No es 5")

Esto es equivalente a:

if x == 5:
print("Es 5")
else:
print("No es 5")
tip

El ternario también es útil para asignar valores de forma compacta:

a = 10
b = 5
c = a/b if b != 0 else -1
print(c) # 2

2️⃣ Patern Matching: match / case​

🟩 Uso de match/case​

En otros lenguajes de programación existe la sentencia switch para manejar múltiples alternativas de manera más legible que con elif. Python no tenía algo parecido hasta la versión 3.10, donde se introdujo el emparejamiento estructural con match/case.

✍️ sintaxis de la estructura 'match/case'
match expresion:
case patron1:
# bloque de codigo si expresion coincide con patron1
case patron2:
# bloque de codigo si expresion coincide con patron2
case patron3 if condicion:
# bloque de codigo si expresion coincide con patron3 y ademas cumple la condicion
case _:
# bloque de codigo por defecto (comodin)
diagrama de estructura match/case
📌 Ejemplo de menú con match/case
opcion = input("Elige opción: ")

match opcion:
case "a":
print("Opción A")
case "b":
print("Opción B")
case "c":
print("Opción C")
case _:
print("Opción no válida")
en este ejemplo

El case _ funciona como un comodín, que se ejecuta si ninguna de las opciones anteriores coincide.

Alternativas múltiples

En un mismo case se pueden poner varias opciones separadas por |.

match con altenativas múltiples
codigo = 404

match codigo:
case 200:
print("OK")
case 400 | 404:
print("Error del cliente")
case 500 | 502 | 503:
print("Error del servidor")
case _:
print("Código desconocido")

🟦 Uso de guards (if)​

Dentro de un case podemos añadir condiciones adicionales con if.

📌 Ejemplo de uso de guards
edad = 20

match edad:
case n if n < 18:
print("Menor de edad")
case n if 18 <= n < 65:
print("Adulto")
case _:
print("Jubilado")

Esto hace que el patrón sea todavía más flexible.

🟨 match con estructuras de datos​

match también puede emplearse con estructuras de datos más complejas como listas, tuplas, etc... aunque esto lo veremos más adelante.

📌 Ejemplo de uso de patern matching con tuplas
coordenada = (0, 1)
match coordenada:
case (0, 0):
print("Coordenada en origen")
case (x, 0):
print(f"Coordenada en eje x: {x}")
case (0, y):
print(f"Coordenada en eje y: {y}")
case (x, y):
print(f"Coordenada en: {x}, {y}")
case _:
print("Error")

✅ Buenas prácticas​

buenas prácticas
  • Usa if/elif/else para condiciones sencillas y claras.
  • Usa match/case cuando tengas muchas alternativas o quieras trabajar con estructuras de datos.
  • Siempre incluye un else (o un case _) para cubrir el caso por defecto.
  • Mantén las condiciones simples; si se vuelven demasiado complejas, divídelas en pasos previos con variables auxiliares.
  • Documenta bien los patrones en match/case cuando no sean obvios.